#ifndef _CODE_H
#define _CODE_H

#include "bee.h"

#define codeNum 39

// 莫尔斯码
static const char *c[codeNum] = {
	".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "..--..", "-.-.--", "-..-."
};
// 对应字符
static const char *w[codeNum] = {
	"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "?", "!", "/"
};

static const char *noTran = "*";

void playCode(char *code);
char *tranCodeStr(char *str);
char *tranCode(char *code);

char *tranCodeStr(char *str) {
	char *resultStr = malloc(512);
	memset(resultStr, 0, 512);
	char *uCode = NULL;
    uCode = strtok(str, " ");
    while(uCode != NULL) {
		strcat(resultStr, uCode);
		if(strcmp(uCode, " ") != 0) {
			strcat(resultStr, tranCode(uCode));
		}
		strcat(resultStr, " ");
    	uCode = strtok(NULL, " ");
    }
	return resultStr;
}

char *tranCode(char *code) {
	for(int i = 0; i < codeNum; i ++) {
		if(strcmp(c[i], code) == 0) {
			return w[i];
		}
	}
	return noTran;
}



void playCode(char *code) {
	statusSet(STATUS_PLAY_CODE);
	while(*code != '\0') {
		TickType_t playCodeTick = xTaskGetTickCount();
		if(*code == '.' || *code == '-') {
			beeStart();
			if(*code == '.') {
				vTaskDelayUntil(&playCodeTick, stPlayDiTime / 10);
			}
			else if(*code == '-') {
				vTaskDelayUntil(&playCodeTick, stPlayDiTime / 10 * 2.5);
			}
			beeStop();
		}
		else if(*code == ' ') {
			vTaskDelayUntil(&playCodeTick, stPlayDiTime / 10 * 1.2);
		}
		vTaskDelayUntil(&playCodeTick, stPlaySepTime / 10);
		code ++;
	}
	statusClean(STATUS_PLAY_CODE);
}


#endif